package thread;

/**
 * 静态方法上使用synchronized后,该方法变成同步方法,并且一定具有同步效果
 */
public class SyncDemo3 {
    public static void main(String[] args) {
        Boo b1 = new Boo();
        Boo b2 = new Boo();

        Thread t1 = new Thread(){
            public void run(){
                b1.dosome();
            }
        };
        Thread t2 = new Thread(){
            public void run(){
                b2.dosome();
            }
        };
        t1.start();
        t2.start();
    }
}

class Boo{
    /*
        成员方法上如果使用synchronized后,那么该方法使用的同步监视器
        对象为"this",即:当前方法的所属对象
     */
//    public synchronized void dosome(){
    /*
        静态方法上如果使用synchronized后,那么该方法使用的同步监视器
        对象为当前类的类对象,即:Class的实例
        注:JVM加载每个类时都会创建一个Class实例来表示这个类的信息,
           而这个Class类的实例称为加载的这个类的类对象.在JVM中每个
           加载的类都有且只有一个类对象,静态方法锁的就是这个对象.
           由于每个类都只有一个类对象,因此静态方法一定具有同步效果.
           类对象会在后期反射的知识点详细介绍.
     */
//    public synchronized static void dosome(){
    public static void dosome(){
        /*
            静态方法中使用同步块时通常指定的同步监视器对象还是类对象
            获取一个类的类对象可以使用:类名.class
         */
        synchronized (Boo.class) {
            try {
                Thread t = Thread.currentThread();
                System.out.println(t.getName() + ":正在执行dosome方法...");
                Thread.sleep(5000);
                System.out.println(t.getName() + ":执行dosome方法完毕!");
            } catch (InterruptedException e) {
            }
        }
    }
}





